博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
19、Flask实战第19天:CSRF攻击与防御
阅读量:5103 次
发布时间:2019-06-13

本文共 3027 字,大约阅读时间需要 10 分钟。

CSRF攻击原理

网站是通过cookie来实现登录功能的。而cookie只要存在浏览器中,那么浏览器在访问这个cookie的服务器的时候,就会自动的携带cookie信息到服务器上去。那么这时候就存在一个漏洞了。如果你访问了一个恶意网站,这个网站可以在网页源码中插入JS代码,使用JS代码给其他服务器发送请求。因为在发送请求的时候,浏览器会自动把cookie发送给对应的服务器,这时候相应的服务器就不知道这个请求是伪造的。从而达到在用户不知情的情况下,给某个服务器发送了一个请求。

 防御CSRF攻击原理

CSRF攻击的要点就是在向服务器发送请求的时候,相应的cookie会自动的发送给对应的服务器。造成服务器不知道这个请求是用户发起的还是伪造的。这时候,我们可以在用户每次访问有表单页面的时候,在网页源码中加一个随机的字符串叫做csrf_token在cookie中也加入一个相同值的csrf_token字符串。以后给服务器发送请求的时候,必须在body中以及cookie中都携带 csrf_token,服务器只有检测到cookie中的csrf_token和body中的csrf_token都相同,才认为这个请求是正常的。否则就是伪造的,那么黑客就没办法伪造请求了。

 

Flask防御CSRF攻击

使用flask_wtf.CSRFProtect来包裹app

 

import osfrom flask_wtf import CSRFProtectapp.config['SECRET_KEY'] = os.urandom(24) #和session一样,必须要配置一个secret key参与加密CSRFProtect(app)

 

然后在模板form表单中添加一个input标签,加载csrf_token

 以上配置就能够在,用户在提交表单后一并把表单中的csrf_token提交到服务器,并和服务器上的csrf_token做对比,这样就能够识别请求是否是伪造的,从而避免CSRF攻击

 

AJAX处理CSRF漏洞

如果我们的表单是通过AJAX提交处理的。示例如下

    ...    
邮箱:
密码:
login.html

 login.js

...class LoginView(views.MethodView):    def get(self):        return render_template('login.html')    def post(self):        email = request.form.get('email')        password = request.form.get('password')        if email == 'heboan@qq.com' and password == '123456':            return '登录成功'        else:            return '登录失败'app.add_url_rule('/login/', view_func=LoginView.as_view('login'))
login视图

以上我们已经成功使用了AJAX处理表单。现在我们启用CSRF,主程序中代码如下:

import osfrom flask_wtf import CSRFProtectapp.config['SECRET_KEY'] = os.urandom(24) #和session一样,必须要配置一个secret key参与加密CSRFProtect(app)

然后我们再次用正确的账号密码登录,发现出现错误,因为我们启用防csrf攻击,但是AJAX那里并没有携带csrf_token,所以请求失败

因此,我们需要在login.html中添加一个表单用来存放token

邮箱:
密码:

编辑AJAX代码段,把表单中的csrf_token传给服务器作比对

再次登录(强制刷新浏览器,因为js有缓存)

 

AJAX处理CSRF漏洞--优化代码 

csrf_token可以放置的head中。在实际项目中,我们一般也是放在头部,这样做有个好处就是:当多处需要用到csrf_token,我们就不需要多次写一个隐藏的csrf_token表单。特别是在模板继承的时候,我们只要在父模板中的head中加入csrf配置,其子模板就可以直接继承了。

编辑login.html

    
...
邮箱:
密码:

 新建一个heboan_ajax.js, 来封装

修改login.js

最后在login.html中要引入封装的js

    ...    

 

这样实现的好处就是以后在其他地方处理CSRF的时候,我们直接把我们封装好的heboan_ajax拿来用就可以了,模板那边可以通过继承实现避免重复定义csrf_token表单和js引入

转载于:https://www.cnblogs.com/sellsa/p/9369019.html

你可能感兴趣的文章
linux 分布式smb,Ubuntu 13.10安装Samba服务器实现局文件共享
查看>>
android 手势数据库,AndroidStudio:手势识别
查看>>
android onnewintent home,android - OnCreate fires twice from onNewIntent - Stack Overflow
查看>>
android sensorhub框架,init.angler.sensorhub.rc
查看>>
eclipse中写安卓的html页面跳转,菜鸟实现(二) eclipse 安卓 点击TextView 跳转页面...
查看>>
android懒加载简书,Android优化--Fragment懒加载
查看>>
js抓取list中item的html,html - i want add item in list (vue.js) - Stack Overflow
查看>>
mysql格式化html,MySQL FORMAT()用法及代码示例
查看>>
html倒计时动画,js+css3倒计时动画特效
查看>>
html更改信息显示不允许,html静态页如何加个不允许提交空信息验证?
查看>>
多媒体计算机应用 在哪些方面,多媒体计算机应用于初中英语教学的研究:多媒体计算机教学有哪些特点...
查看>>
html嵌入zabbix网页,通过Zabbix通过Python发送HTML和纯文本电子邮件
查看>>
路由 asp.net mvc html,asp.net-mvc – 为什么需要为Html.Action定义的路由?
查看>>
goquery 查找html标签,goquery库的使用
查看>>
bzoj 3473 后缀自动机多字符串的子串处理方法
查看>>
现金销售与欠款销售
查看>>
MongoDb系列
查看>>
【C语言】控制台窗口图形界面编程(七):鼠标事件
查看>>
BZOJ3732 Network
查看>>
DJango中ORM操作
查看>>